約 5,705,287 件
https://w.atwiki.jp/mitim/pages/23.html
注意書き この文章はMTSのチュートリアルTutorial Sims 3 XML Tuning Moddingの意訳です。 Sims3では基本的にXML形式でスクリプトを実現しているので、優先的に訳しました。初期に出てきたちょっとした設定変更MODのほとんどは、おそらくXML編集で実装してあるはずです。 また、10/1現在の各ツールに合わせて記述を変更している箇所があります。 訳ミス等を見つけてしまったら、メールで連絡を。(文章を読んで頭が「?」で埋まったら、原文を参照してください) The Sims 3 XMLをチューニングしてMOD作成 序章 このチュートリアルでは、XMLをチューニングしたMODの基本的な作り方について説明する。 Sims2と違い、多くのものがBHAV形式よりもXML形式で登録されており、シンプルなMOD作りの範囲なら普通のユーザにとってははるかに利用しやすいし、MOD作成についての特別な知識も要求されないようになった。 XMLチューニングしたMODは、さまざまな物事の変更を提供してくれる。 - シムの膀胱がいっぱいになる早さとか、夜の子供の門限時間とか - すべての相互作用による、より良い自立行動の設定を。 XMLファイルは.packageファイル内に入っているが、取り出してさえしまえば、簡単に、好きなように編集できる。 個々のプレイヤーは彼らのゲームにMODを導入できるだろう、様々な人の手による様々なMODをダウンロードすることで起こる衝突やクラッシュを解決しながら。 難易度 もしあなたが中々に優秀なコンピュータユーザ(色々覗いてみたりどうなってるの?を見つけ出すことを楽しんでたり、英語の読み書きに優れてたり)なら、これを読んでできるだろう。XMLチューニングのMODはシンプルで簡単だ。もしあなたが既存のMODのインストールがうまくできないとか、COPY PASTEができないとか、靴紐をうまく結べないとかいうレベルなら、とても難しいですよ。 クレジット 多くの感謝を最初のチュートリアルの筆者であるInge Jonesに。私はあつかましくも彼女の言い回しや全体の構成を借用しつつ、画像や色々を加えてほんの少しユーザフレンドリーなものにしただけだ、ありがとう、Inge! 必要なもの 基本となるMODフレームワークファイル、d3dx9_31.dll。 もしDelphy's Helper Monkeyを使っているなら、これはもう手元にある。手動インストールで頑張っているのなら、Pescado at MATYから取得可能だ。インストールしたら、使用説明を確認しておくこと。自作MOD内で使用したり、他のMODを使うときにいるものだ。 S3PE by Peter jones。 ザ・シムズ3パッケージエディタ。Sims3 Toolsで手に入る。(※ S3PEを動かすためには.net Frameworkが必要) 以上がちゃんとインストールされているか、作業を始める前に確認すること。 チュートリアル ここまではいいかな。始めよう! 全ての画像はクリックすると大きくなるよ(※訳注 ここでは非対応です) S3PEを立ち上げる S3PEはスタートメニューの"すべてのプログラム - S3PE - S3PE"で立ち上げられる。 ※訳注 なんだこの章? GameplayData.packageファイルを開く S3PEで"File - Open"。 \Program Files\Electronic Arts\ザ・シムズ3\Game\Bin\Gameplay\ を開く。 GameplayData.packageというファイルが1つあるはず。選択して"開く(O)"をクリック。 S3PEはしばらくしするとデータを噛み砕いて表示してくれる。 ※訳注 Windows Vista 以降の場合、S3PEから直接このファイルにアクセスしようとすると拒否されるはず。対象のファイルを別のワークディレクトリにコピーしてから開こう。 リソース名の表示とソート S3PEの"Display Name"にチェックを付ける。これはName列を表示して何が何なのかわかるようにする。 "Sort"にチェックを付ける。リストの列名でソートできるようになる。 "Name"列を横に広げ、列名をクリックしてリソースを名前順にソートする。ゲーム内をカバーする膨大な量の素材の名前によるリストが確認できるはず。 ※訳注 S3PEの現状版に合わせて記述を変えています。 選択と表示 何か興味を引くものを発見するまで、リストを下にスクロールしていく。リストのアイテムを選択したら、"Value"ボタンをクリックする。 調査 テキストの表示されたウィンドウが出ただろう。これが選択したコンテンツのXMLリソースだ。リソースによっては、きわめてシンプルなもの(スクリーンショットのように)や、かなり複雑で混乱するものもある。 次のような行を見つけよう: !--(minutes, GPE Default 8) Amount of time Adult/Elder Sim spends Smashing DollHouse before collapse.-- この !-- -- タグは開発者コメントだ。何が書かれていてもゲーム内では無視される。これらのコメントは、何がどうなっているのか、何を変えればいいのかを知るための大きなヘルプになる。 もし何もコメントがなくても、それでも普通はその名前(※訳注 タグ名やアトリビュート名のこと)から、大体何が何だかわかるだろう。ほとんどの名前と値はかなり自己説明的だ。 エクスポート 求めているリソースを見つけたら、"File - Export"でコピーをセーブできる。どこかに見つけたものをセーブしよう。ファイル名を変えようとか今は気にしないで、その名前のままでセーブしよう。 新たなパッケージを作る S3PEで "File - New" で新たなパッケージをつくる。 "File - Import" でエクスポートしたファイルを選択。 "Resource Details"が表示されるが、何も変えてはいけない - どのようになっててもそのデフォルトの設定のまま"Ok"をクリック。 "File - Save As"で名前をつけてファイルをセーブする。それが何なのかわかる説明的な名前にするよう心がけること。 ※訳注 そして一意性を確保するためにも、作成者名を含んでおいた方がよりベターだと思う。 編集 リソースを選択したら、"Editor"ボタンをクリックして外部エディタを開く。デフォルトではNotepadで開き、"調査"の章と見た目が同じように見える - でも好きなエディタを使って編集して。 XMLを望むように編集する。このチュートリアルではこれ以上の細部へはあなたを導けない。すべての異なる「何を変えてどうしたいか」には対応できないから。最上のやり方は「試してみて」「確認する」こと。オリジナルに沿ったベーシックなフォーマットになるよう心がけて。 ※ もしすでにXML編集に長けているなら、ちゃんと上書きや削除したいタグを見つけられる。もしここに書いてある意味や何をすべきかについて見当もつかなくても、不安にならないで。 保存 ノートパッドで編集したら、通常のようにセーブしてノートパッドを閉じる。 S3PEが"Commit changes?"と聞いてくる。"Yes"ボタンをクリック。 S3PEで"File - Save"でセーブする。 テスト 作成したファイル(.package)をMOD用フォルダに配置する。 Sims 3を立ち上げ、変更が働くか、望んだ通りに動くかを確認する。ちゃんと動いた?すばらしい!おかしかった?S3PEに戻って今度こそ望むような動きになるよう編集しよう。(ゲームを閉じて、変更して、セーブして、MODを配置して、もう一度ゲームを開いて動作を確認) 何か質問? このチュートリアルで質問がある?このスレッド(MTS)で質問すればヘルプしてくれるよ。 ※訳注 もちろん英語です。
https://w.atwiki.jp/yuyutoton/pages/1432.html
ボスドロップの部分を変えてみた。 追加情報等あったら編集してください。 -- (名無しさん) 2008-03-06 12 59 40 稀にコブリンHDが出る可能性があるのでは? -- (敗北する天使) 2008-03-18 14 58 24 ↑実際に出るまでは追加したらいかんのは常識だぞ -- (名無しさん) 2008-03-18 16 01 02 なぜかB3Fで赤石ドロップ。必要ならロダに上げますが? -- (名無しさん) 2008-03-19 14 42 47 ↑その必要はないよ。 何故なら、そのフロアでは扉と石の色の対応を説明しているから。 (つまり、赤石は意図的に用意されたハズレって事) -- (名無しさん) 2008-03-19 15 55 08 なるほど。ありです。 -- (名無しさん) 2008-03-22 20 18 17 演習用遺跡でオレガーAM2ドロップ。かなりビビッた。 SSも撮りましたよ。 うpロダに上げときますね -- (㌧デモ兵器) 2008-04-10 21 25 36 ↑ 追加すべき? -- (月影無雲) 2008-04-17 21 32 27 コブリンHD確認 -- (名無しさん) 2008-04-24 22 13 32 生憎フェイク作れるほどの技術力が無いので。 ただ確率は結構低いかな、かな? -- (㌧デモ兵器) 2008-04-28 22 22 04 パタパタからリペア100、EN500確認。 -- (名無しさん) 2008-09-11 20 58 18 ここからは報酬変更後の情報になります。 クリア報酬にてメガトンオーLG、オレガーAM2を確認。 -- (名無しさん) 2009-01-05 23 34 43 ↑俺の弟が演習遺跡で出してました -- (名無しさん) 2009-05-09 10 44 22 タイトル部分 チュートリアルシティ 演習遺跡 文章部分 チュートリアルシティから行ける演習用の遺跡 現在はフクシアシティですね。 編集できないので、どなたかお願いします。 -- (ななしさん) 2009-08-12 13 49 38
https://w.atwiki.jp/civilization/pages/2383.html
初心者ガイド/チュートリアル詳説/01.ユニットの選択と移動 前ページ次ページ初心者ガイド/チュートリアル詳説 初心者ガイド/チュートリアル詳説/01.ユニットの選択と移動 [#kc2f6be6] ユニットの選択 [#i73f06a5] 選択されたユニット [#w9c4ccdf] ユニットを画面中央に [#t97973bc] ユニットの移動 [#r43f9b7f] 都市の建設 [#r042cbfc] ユニットの選択 原文 訳 You will begin each game with a Settler unit. ゲームの開始時には、プレイヤーは開拓者ユニットを所有しています。 Click on the Settler by placing the cursor over the Settler and pressing the Left Mouse Button. 開拓者をクリックしてください。カーソルを開拓者に合わせてマウスの左ボタンをクリックします。 選択されたユニット 原文 訳 This unit is now activated and ready to be given orders. ユニットがアクティブになりました。これで指示を与えられます。 You can tell when a unit is selected because their unit flag will glow. ユニットの旗が光っているので、ユニットが選択されているのがわかります。 ユニットを画面中央に 原文 訳 I have moved the camera into the fog of war; the darkness covering each new and unexplored world. 画面が暗闇のほうに移動しました。この闇の部分に包まれているのが、まだ開拓されていない新しい世界です。 Press C to center the camera on the selected unit. Cキーを押すと、選択されたユニットが画面中央に映し出されます。 ユニットの移動 原文 訳 The Settler has one purpose to build your city. 開拓者には、都市を建設するという目的があります。 Choosing the best location to build your City is the key to its prosperity. For now I will recommend where to build your City with this blue circle. 都市建設に最適な場所を選ぶことが、繁栄の鍵になります。この場合は、ブルーの円で囲まれた部分が、都市建設に推奨される場所です。 Move your Settler to the blue circle by clicking on the circle with the right mouse button. 開拓者をブルーの円に移動させます。円をマウスで右クリックしてください。 都市の建設 原文 訳 Congratulations! You have successfully moved your Settler unit. おめでとう! 開拓者ユニットの移動が完了しました。 Cities are the building blocks of your empire. To have your Settler unit found a City, click on the Build City button in the user options across the bottom. 都市は、国家の基本的要素です。画面下のユーザーオプションにある〈都市を建設〉ボタンをクリックすると、開拓者ユニットが都市を建設します。
https://w.atwiki.jp/blender2chwiki/pages/34.html
空白の部分も暫定的にという形で解説されているサイト・ブログ等のリンクを張っておくだけでもだいぶ情報量が違うと思います。加え、今はBlender2.48a?のSSが貼られていますがもうすぐ2.5に移行してしまうんですね・・・ - 2009-04-14 18 49 00 更新もっとずっとのんびりでいいと思いますよ。2.49すぐ出そうですし。 - 名無しさん 2009-04-15 21 25 50 各ページ1BOXにして機能・目的でタグをつけ、左の分類はメニュー忠実に階層化したほうがよいのでは?例えば、ButtonsWindow/Shading/Materialbuttons/Preview別ページ同層でLinksandPipelineタグはマテリアルとか。一つの案ですが・・・ - 名無しさん 2009-04-15 21 48 50 ページ作った事無いのに勢いで作ったからタグとかBOXとか階層化とかさっぱりわからないんだ。ごめんね。 - 名無しさん 2009-04-17 07 39 23 勝手に書き足してます - 名無しさん 2009-04-19 20 39 47 メニューがおかしかったのを修正しました・・・何か意図があったなら元に戻しておいてくださいです。 オレンジ文字の中で黒字が耐えられなかったので・・・ - 2009-05-01 23 35 34 中の人お疲れ様です・・・ - 名無しさん 2009-08-29 23 45 03 メニュー内のまだページが無いリンクを外しました。また、「オレンジの中の黒字~」とのことなので、オレンジ文字にして背景着色してみました。無いページに飛んでしまう予防いかがでしょうか。 - 名無しさん 2009-09-07 16 35 01 ページが無いなら自分で作ればいいと思うよ - 名無しさん 2009-09-09 00 34 23 このwikiが作成された時?にメニューの見出しが作られる(未作成ページにリンクなし)→他の方がメニューの色修正(リンクなし黒字→リンク張ってオレンジ字に)→とりあえず色はそのままでリンク無しに戻した、という流れ。みんなで書き込みできるといいね。作成意図と違うようだったら戻しちゃって下され。あと管理人さん認証ありがとう - 2009-09-07 16 35 01 2009-09-10 06 31 26 トップにファイルを誤アップ・・・すんません - 名無しさん 2009-12-17 02 21 14 メニューの改行詰めました - 名無しさん 2010-03-26 15 53 54 FAQのメタセコエクスポーターの項目が外部サイトのファイル直リンクになっていたので、サイトトップへのリンクに変更しました。直リンクは許可出てるところでないと - 名無しさん 2010-03-26 16 29 02 再配布可能なBlender関連ファイルのバックアップの為にファイル置き場ページを作りかけたんだけど、このwikiに添付できるのが1Mまでだったのでとりあえず中断。 - 名無しさん 2010-09-08 05 43 25 「2.5ガイド 日本語化計画」途中まで翻訳されてしばらくたつようですが、他のところで翻訳されたものが公開されているので(blugjpまとめサイトにリンクあり)、2.5ガイド 日本語化計画ページにそちらを案内出して、トップページの翻訳する人募集は取り下げるのを提案したいです。自分は翻訳参加してなかったので、まずは意見のみ。 - 名無しさん 2011-08-19 22 40 20
https://w.atwiki.jp/legendofnorrath/pages/52.html
TUTORIAL3 - Quests ~クエストについて~ このチュートリアルでは、クエストの完了とPowerの取得について学びます。 *クエストカードについて *レベルについて *報酬について *Powerの取得について *クエストによる勝利について === 双方のプレイヤーは、4枚のクエストカードのみを格納する、クエスト・パイルを持っています。 もし、対戦相手が同じクエストを完了しようとしていれば、あなたも急がなければいけません。 また、その途中で、あなたは対戦相手のユニットと戦闘する必要があります。 === (Note to Necloの画像) あなたはこれがレベル2のクエストであることを確認できますが、これは完了に2つのレベルトークンが必要であることを意味します。 ゲーム開始時に、双方のプレイヤーのレベル2のクエストが、クエスト・パイルからプレイマットに置かれます。 これは右上のアーキタイプアイコンが示すように、メイジ用のクエストです。 あなたは、自分のアバターがメイジである場合のみ、クエスト・パイルにこのクエストを加えることができます。 いくつかのクエストはジェネリックであり、どんなクエスト・パイルにでも加えることが可能です。 このクエストは、タイトルの下に報酬(reward)のトレイトを持っています。 このクエストを完了させたプレイヤーは、ゲームテキストに示された特別なボーナスを得られます。 2段落目の説明ですが、「このカードがメイジの属性を持ったクエストであること」を示し、 「メイジのデッキのみに組み込むことができる」ことを示しています。 「他のアーキタイプが、場に出されたこのクエストを進めることができない」わけではありません。念のため。 ジェネリック(Generic)のカードは、クエストカードに限らず、すべてのカードをすべてのアーキタイプのデッキに組み込むことができます。 一部のクエスト報酬に関しては、状況によっては逆にリスクとなり得るものがあります。 完了時に、相手のアバターとの戦闘が始まったり、双方のユニットを手札に戻すものもあります。 また、有用な報酬は、(先にクエストを完了されることで)相手にも利用されるリスクがあります。 どうしても得たい報酬は、できるだけ確実に得ておきましょう。 === スクリーンの左下にあるのが、あなたのクエスト・パイルアイコンで、クリックすることで残りのクエストを見ることができます。 相手のクエスト・パイルにあるカードは見ることができません。 スクリーン左側の、クエスト・パイルアイコンをクリックしてみましょう。 === クエスト・パイルウィンドウのカードにマウスカーソルを重ねることで、レベル4、5、6の3つのカードを見ることができます。 あなたがデッキを構築する際、あなたのクエスト・パイルにはレベル2、4、5、6のカードが1枚づつ入っている必要があります。 (レベル2のクエストはプレイマットに設置されています) このレベルは、プレイヤーに適度な挑戦を提供するため、連続したものではありません(1、2、3、4)。 Xをクリックして、クエスト・パイルを閉じてください。ウインドウの右上にあります。 === クエストを完了するたびに、あなたは1のPowerを得て、あなたのクエストメーターのジェムが点灯します。 あなたのターン開始時、あなたは(3+双方のプレイヤーが完了したクエストの数に等しいPower)を得ます。 あなたがクエストを完了した際、次にレベルの高いクエストが、あなたのクエスト・パイルから設置されます。 あなたが4つのクエストを完了すれば、あなたの勝利です! どちらのプレイヤーがクエストを完了しても、双方のプレイヤーのPowerが増えます。 ということは、逆にクエストを完了せず、Powerを抑制することも1つの作戦です。 === すべてのカードを右クリックすることで、拡大されたカードを調べることが可能です。 (カードを見終わったら、もう一度クリックすることで隠せます) ゲームに関係した数字、テキストに加えて、それぞれのカードに関するロア(ノーラスにおけるストーリー)を見ることができます。 いくつかのカードはゲームテキストのボックスに収まらないロアを持っているため、ロアボタンを持っています。 プレイマットの左にあるクエスト、NOTE TO NECLOで確認してみましょう。 右クリックして拡大版を開き、ロアボタンをクリックして本当の メモ を見ましょう。 最後のくだりは NOTE TO NECLOと、メモ、覚書を意味する NOTE をかけた・・・どうでもいいですね。 戻る
https://w.atwiki.jp/sangokushi11/pages/18.html
成都攻略 全武将を梓潼に集める ↓ 諸葛亮を軍師にする ↓ 馬超を引き抜く ↓ 梓潼で徴兵し、兵装を兵力分揃える ↓ 関羽・張飛・趙雲・馬超等強力な武将をそれぞれ違う部隊にする ↓ 梓潼の全軍で成都に出兵(7部隊くらいあれば楽勝) ↓ 全部隊で成都を囲み一斉攻撃する ↓ 成都陥落
https://w.atwiki.jp/akasatanahama/pages/142.html
概要 レシピを追加する。 前のチュートリアルまで実装している段階でのコードである。 ソースコード 残念!ソースコードの追加実装などいらないのだよ!! あくまでも前のチュートリアルまで実装できていればだが、レシピの実装はjson側で行うため追加コードは必要ない。 アセット aluminium_block.json[recipe] src/main/resources/assets/aluminiummod/recipes/に配置する { "type" "minecraft crafting_shaped", "pattern" [ "###", "###", "###" ], "key" { "#" { "item" "aluminiummod aluminium" } }, "result" { "item" "aluminiummod aluminium_block" } } aluminium.json[recipe] { "type" "minecraft crafting_shapeless", "ingredients" [ { "item" "aluminiummod aluminium_block" } ], "result" { "item" "aluminiummod aluminium", "count" 9 } } 解説 MC1.12より、今までのレシピの登録方法が非推奨となり、代わりにjson形式でレシピを登録することになった。 その為、バニラにレシピを追加するだけのMODなら最悪@Modをつけたクラスを作成するだけでjavaに触れるのは終わる。 名称はそのままforge側に登録され、/recipeコマンドで使われるため作られるアイテムのレジスター名にするのが最適である。 まず、type要素でクラフトタイプを指定する。"minecraft crafting_shaped"で定形レシピ、minecraft crafting_shapelessで不定形レシピを指定する。 次に、定形レシピではpatternでレシピの形を指定し、その文字に当てはまるアイテムをkeyで指定する。 不定形レシピではingredientsで指定する。 最後に、resultで結果を登録する。 それぞれ で区切ってある前がMapのkey、後ろがvalueであると考えれば良い。 item要素で modid レジスター名 、count要素で個数、data要素でメタデータ(アイテムなのでblockstateは登録できない)を指定する。 アイテムの種類を増やしたいときはkey若しくはingredientsを下のように変更すれば良い。 +... 定形 "key" { "#" { "item" "aluminiummod aluminium" }, "A" { "item" "minecraft skull", "data" 4 }, 不定形 "ingredients" [ { "item" "aluminiummod aluminium_block" }, { "item" "minecraft skull", "data" 4 ], レシピ追加通知 MC1.12からの新機能として、「レシピブック」がある。 また、バニラのアイテムは入手したとき右上に「新規レシピ追加」という通知が出る。 今回はアイテムを大量に追加するMOD用に「レシピブック」とイベントを使って通知を出す。 (進捗のシステムを使ってレシピを出すことも出来るが、書くべきjsonファイル数が多くなる。そのやり方は進捗の追加チュートリアルで記載予定。) +... AluminiumMod.java クラス末尾に追加する。 @Mod.Instance("aluminiummod") public static AluminiumMod aluminiumInstance; @Mod.EventHandler public void init(FMLInitializationEvent event) { HOLDER.register(); } //アイテムを拾ったときのイベント。 @SubscribeEvent public void onPickupItem(EntityItemPickupEvent event) { this.aluminiumUnlockRecipes(event.getItem().getItem(), event.getEntityPlayer()); } //コンテナを閉じたとき(チェストやプレイヤーインベントリなど)のイベント。 @SubscribeEvent public void onCloseContainer(PlayerContainerEvent.Close event) { for (ItemStack itemStack event.getEntityPlayer().inventoryContainer.getInventory()) { this.aluminiumUnlockRecipes(itemStack, event.getEntityPlayer()); } } private void aluminiumUnlockRecipes(ItemStack stack, EntityPlayer player) { if (FMLCommonHandler.instance().getSide().isClient()) { Item item = stack.getItem(); int meta = stack.getMetadata(); ItemStack itemStack = new ItemStack(item, 1, meta); //もしレシピを保持するリストに合致すれば if (!this.HOLDER.map.isEmpty() this.HOLDER.map.containsKey(itemStack)) { List ResourceLocation list = this.HOLDER.map.get(itemStack); //player.unlockRecipes(ResourceLocation[] locations)でレシピブックに追加する。 player.unlockRecipes(list.toArray(new ResourceLocation[list.size()])); } } } AluminiumRecipeHolder.java レシピをリソースから読み取って保持するクラス。 package com.tntmodders.tutorial; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.stream.JsonReader; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLCommonHandler; import java.io.*; import java.net.URL; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class AluminiumRecipeHolder { //ItemStackよりそのアイテムが鍵となるレシピを取得できるようにする。 public static final Map ItemStack, List ResourceLocation map = new ItemStackHashMap(); public void register() { if (FMLCommonHandler.instance().getSide().isClient()) { //assets/ modid /recipes/よりリソースを取得する。 this.getResource("assets/aluminiummod/recipes/"); } } public void getResource(String path) { ClassLoader loader = AluminiumMod.class.getClassLoader(); URL url = loader.getResource(path); //jarファイル内か否かで処理が変化する。 if (url.getProtocol().equals("jar")) { String[] strings = url.getPath().split(" "); String leadPath = strings[strings.length - 1].split("!")[0]; File f = new File(leadPath); JarFile jarFile; try { //jarファイル自体を取得する。(zipファイル・jarファイルとして扱う事ができる。) jarFile = new JarFile(f); Enumeration JarEntry enumeration = jarFile.entries(); while (enumeration.hasMoreElements()) { JarEntry entry = enumeration.nextElement(); String s = entry.getName(); if (s != null s.startsWith(path) s.endsWith(".json")) { InputStream stream = null; try { stream = loader.getResourceAsStream(s); //inputstreamを使ってjarファイル内のjsonを読み込む。 this.readStream(stream, s); stream.close(); } catch (Exception e) { e.printStackTrace(); } } } } catch (IOException e) { e.printStackTrace(); } } else { List File list = this.getListFile(path); if (list.size() 0) { for (File recipe list) { InputStream stream = null; try { stream = new FileInputStream(recipe); this.readStream(stream, recipe.getName()); stream.close(); } catch (Exception e) { e.printStackTrace(); } } } } } //ファイルを全て取得する。これもjarか否かによって変わる。 private List File getListFile(String path) { List File files = new ArrayList (); ClassLoader loader = AluminiumMod.class.getClassLoader(); URL url = loader.getResource(path); if (url.getProtocol().equals("jar")) { String[] strings = url.getPath().split(" "); String leadPath = strings[strings.length - 1].split("!")[0]; File f = new File(leadPath); JarFile jarFile; try { jarFile = new JarFile(f); Enumeration JarEntry enumeration = jarFile.entries(); while (enumeration.hasMoreElements()) { JarEntry entry = enumeration.nextElement(); String s = entry.getName(); if (s != null s.startsWith(path) s.endsWith(".json")) { files.add(new File(loader.getResource(s).getPath())); } } } catch (IOException e) { e.printStackTrace(); } } else { File packFile = FMLCommonHandler.instance().findContainerFor(AluminiumMod.aluminiumInstance).getSource(); File newFile = new File(packFile.toURI().getPath() + path); files = Arrays.asList(newFile.listFiles()); } return files; } private void readStream(InputStream stream, String name) { //inputstreamよりJSONを読み込む。 JsonReader reader = new JsonReader(new InputStreamReader(stream)); JsonObject jsonObject = new Gson().fromJson(reader, JsonObject.class); //文字列の中にパスが紛れ込んだ場合それを消す。また、".json"を抜いてResourceLocationとして保存する。 ResourceLocation location = new ResourceLocation("aluminiummod", name.replaceAll("assets/aluminiummod/recipes/", "") .replaceAll(".json", "")); //定形レシピでキーを"#"にしたアイテムを鍵とする。 if (jsonObject.has("key") jsonObject.getAsJsonObject("key").has("#")) { Item item = Item.getByNameOrId(jsonObject.getAsJsonObject("key").getAsJsonObject("#").get("item").getAsString()); int i = 0; if (jsonObject.getAsJsonObject("key").getAsJsonObject("#").has("data")) { i = jsonObject.getAsJsonObject("key").getAsJsonObject("#").get("data").getAsInt(); } ItemStack stack = new ItemStack(item, 1, i); List ResourceLocation locations = map.containsKey(stack) ? map.get(stack) new ArrayList ResourceLocation (); locations.add(location); map.put(stack, locations); } //不定形レシピで一番上に書いたアイテムを鍵とする。 else if (jsonObject.has("ingredients") jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().has("item")) { String s = jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().get("item").getAsString(); Item item = Item.getByNameOrId(s); int i = 0; if (jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().has("data")) { i = jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().get("data").getAsInt(); } ItemStack stack = new ItemStack(item, 1, i); List ResourceLocation locations = map.containsKey(stack) ? map.get(stack) new ArrayList ResourceLocation (); locations.add(location); map.put(stack, locations); } } //ItemStackを使ったマップを定義する。 public static class ItemStackHashMap K extends ItemStack, V extends List ResourceLocation extends HashMap K, V { public V get(Object key) { if (key instanceof ItemStack this.containsKey(key)) { for (Map.Entry K, V entry this.entrySet()) { if (entry.getKey().getItem() == ((ItemStack) key).getItem() entry.getKey().getMetadata() == ((ItemStack) key).getMetadata()) { return entry.getValue(); } } } return null; } @Override public boolean containsKey(Object key) { if (key instanceof ItemStack) { ItemStack itemStack = ((ItemStack) key); for (ItemStack stack this.keySet()) { if (stack.getItem() == itemStack.getItem() stack.getMetadata() == itemStack.getMetadata()) { return true; } } } return false; } } } コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/melty_cmv/pages/177.html
とりあえず。言い訳しておくと、自分はレンしか見てな・・・もとい、レン以外よく知らないのであまりいい集め方はできないかも。 英語のもあるけど、世に埋もれてそうだしいいかなと。 A~M 横槍 【0から始めるメルブラ】遠野秋葉 基礎の基礎の基礎コンボ+解説 AC http //www.nicovideo.jp/watch/sm2276242 IKUSAT Aoko Tutorial AC http //www.youtube.com/watch?v=UWggitBqiPo #meltyblood.eu Arcueid Beginner Combo Tutorial AC http //www.youtube.com/watch?v=GknMRMIvHXA IKUSAT Ciel tutorial PS2 http //www.youtube.com/watch?v=Sbqaak52pjc ripple Len Tutorial AC http //www.youtube.com/watch?v=xEUuHGo_w2U MECH-Hisui Tutorial AC http //www.youtube.com/watch?v=feDNbsXdnGM Xenozip M.Hisui basic mixups AC http //www.youtube.com/watch?v=5ben9dFcK5Y 動画の解説文にいろいろ細かいことが書かれてるんですが英語ですw Tiggy F-Miyako combo video/reference tool AA http //www.youtube.com/watch?v=9RHRqJo4HQE N~Z 猫が如く ネコアルク基礎コンボ集 AC http //www.youtube.com/watch?v=hfIn379jqrk Ghetto F-Roa basics video AA http //www.youtube.com/watch?v=VX7X4JQYqYU Ultima66 Satsuki Essentials and Tricks AC http //www.youtube.com/watch?v=Ts1SBOb9xoY 英語教材として非常に優秀w いや、実際格ゲーの英語を書くとき参考になると思う。 横槍 【1から始めるメルブラ】シオン 基礎コンボ動画+解説 AC http //www.nicovideo.jp/watch/sm3406216 pei NIGHT ON THE BLOOD LIAR FT http //www.nicovideo.jp/watch/sm15963 ポタ ver.B2 白レン実戦向き?コンボ集 ~FINAL~ AC http //www.nicovideo.jp/watch/sm1267500 ダメレベ系のコメが気になる人はこれどうぞ。 C-Moon Red Arcueid Tutorial AA http //www.youtube.com/watch?v=6yus17fknwA
https://w.atwiki.jp/akasatanahama/pages/126.html
概要 村人の職業を追加し、専用の家を村に生成させる。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.VillagerRegistry; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; import net.minecraft.world.gen.structure.MapGenStructureIO; @Mod(modid = "AluminiumMod", name = "Aluminium Mod", version = "1.0.0") public class AluminiumMod { /** * 村人IDの宣言 * 0~4は既存の村人として設定されているため、使ってはいけない */ public static final int metalVillagerID = 334; //追加するアイテム・ブロックの宣言 public static Item aluminium; public static Block oreAluminium; //村人の宣言 @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { //アイテム・ブロックの実装 aluminium = new Item() .setCreativeTab(CreativeTabs.tabMaterials) .setUnlocalizedName("aluminium") .setTextureName("aluminiummod aluminium"); GameRegistry.registerItem(aluminium, "aluminium"); oreAluminium = new AluminiumOre() .setBlockName("oreAluminium") .setBlockTextureName("aluminiummod aluminium_ore"); GameRegistry.registerBlock(oreAluminium, "oreAluminium"); } @Mod.EventHandler public void init(FMLInitializationEvent event) { //村人IDの登録 VillagerRegistry.instance().registerVillagerId(metalVillagerID); //村人の登録 VillagerRegistry.instance().registerVillageTradeHandler(metalVillagerID, new AluminiumTrade()); if (FMLCommonHandler.instance().getSide().isClient()) { VillagerRegistry.instance().registerVillagerSkin(metalVillagerID, new ResourceLocation("aluminiummod textures/mobs/metal_villager.png")); } //村人生成の登録 VillagerRegistry.instance().registerVillageCreationHandler(new AluminiumVillageCreation()); //構造物の登録 MapGenStructureIO.registerStructure(AluminiumHouse.class, "AluminiumHouse"); MapGenStructureIO.func_143031_a(AluminiumHouse.class, "AluminiumHouse_"); } } AluminiumOre.java 鉱石の追加 と同様 AluminiumTrade.java package tutorial.aluminiummod; import cpw.mods.fml.common.registry.VillagerRegistry; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.village.MerchantRecipe; import net.minecraft.village.MerchantRecipeList; import java.util.Random; public class AluminiumTrade implements VillagerRegistry.IVillageTradeHandler { //村人の交換を追加する @Override public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random) { //アルミニウム一個をエメラルド一個と交換する recipeList.add(new MerchantRecipe(new ItemStack(AluminiumMod.aluminium, 1), new ItemStack(Items.emerald, 1))); //アルミニウム鉱石一個とエメラルド二個とアルミニウム一個を交換する recipeList.add(new MerchantRecipe(new ItemStack(AluminiumMod.oreAluminium, 1),new ItemStack(Items.emerald, 1) , new ItemStack(AluminiumMod.aluminium, 1))); } } AluminiumVillageCreation.java package tutorial.aluminiummod; import cpw.mods.fml.common.registry.VillagerRegistry; import net.minecraft.util.MathHelper; import net.minecraft.world.gen.structure.StructureVillagePieces; import java.util.List; import java.util.Random; public class AluminiumVillageCreation implements VillagerRegistry.IVillageCreationHandler { //その村人がどのくらいの頻度で生成されるかを決める @Override public StructureVillagePieces.PieceWeight getVillagePieceWeight(Random random, int i) { return new StructureVillagePieces.PieceWeight(getComponentClass(), 50, MathHelper.getRandomIntegerInRange(random, i, i + 1)); } //建築物のクラスを渡す @Override public Class ? getComponentClass() { return AluminiumHouse.class; } //建築物生成時に呼ばれる @Override public Object buildComponent(StructureVillagePieces.PieceWeight villagePiece, StructureVillagePieces.Start startPiece, List pieces, Random random, int p1, int p2, int p3, int p4, int p5) { return AluminiumHouse.func_74915_a(startPiece, pieces, random, p1, p2, p3, p4, p5); } } AluminiumHouse.java package tutorial.aluminiummod; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureVillagePieces; import net.minecraftforge.common.ChestGenHooks; import java.util.List; import java.util.Random; import static net.minecraftforge.common.ChestGenHooks.VILLAGE_BLACKSMITH; public class AluminiumHouse extends StructureVillagePieces.Village { private boolean hasMadeChest; public AluminiumHouse() { } public AluminiumHouse(StructureVillagePieces.Start p_i2103_1_, int p_i2103_2_, Random p_i2103_3_, StructureBoundingBox p_i2103_4_, int p_i2103_5_) { super(p_i2103_1_, p_i2103_2_); this.coordBaseMode = p_i2103_5_; this.boundingBox = p_i2103_4_; } //構造物を生成するメソッド public boolean addComponentParts(World p_74875_1_, Random p_74875_2_, StructureBoundingBox p_74875_3_) { if (this.field_143015_k 0) { this.field_143015_k = this.getAverageGroundLevel(p_74875_1_, p_74875_3_); if (this.field_143015_k 0) { return true; } this.boundingBox.offset(0, this.field_143015_k - this.boundingBox.maxY + 6 - 1, 0); } //ブロックを指定した範囲内に敷き詰める this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 1, 0, 9, 4, 6, Blocks.air, Blocks.air, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 0, 0, 9, 0, 6, Blocks.cobblestone, Blocks.cobblestone, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 4, 0, 9, 4, 6, Blocks.cobblestone, Blocks.cobblestone, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 5, 0, 9, 5, 6, Blocks.stone_slab, Blocks.stone_slab, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 1, 5, 1, 8, 5, 5, Blocks.air, Blocks.air, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 1, 1, 0, 2, 3, 0, Blocks.iron_block, Blocks.iron_block, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 1, 0, 0, 4, 0, Blocks.log, Blocks.log, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 3, 1, 0, 3, 4, 0, Blocks.log, Blocks.log, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 1, 6, 0, 4, 6, Blocks.log, Blocks.log, false); //指定した相対座標にブロックを設置する this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.iron_block, 0, 3, 3, 1, p_74875_3_); this.fillWithBlocks(p_74875_1_, p_74875_3_, 3, 1, 2, 3, 3, 2, Blocks.iron_block, Blocks.iron_block, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 4, 1, 3, 5, 3, 3, Blocks.iron_block, Blocks.iron_block, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 0, 1, 1, 0, 3, 5, Blocks.iron_block, Blocks.iron_block, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 1, 1, 6, 5, 3, 6, Blocks.iron_block, Blocks.iron_block, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 5, 1, 0, 5, 3, 0, Blocks.fence, Blocks.fence, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 9, 1, 0, 9, 3, 0, Blocks.fence, Blocks.fence, false); this.fillWithBlocks(p_74875_1_, p_74875_3_, 6, 1, 4, 9, 4, 6, Blocks.cobblestone, Blocks.cobblestone, false); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.flowing_lava, 0, 7, 1, 5, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.flowing_lava, 0, 8, 1, 5, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.iron_bars, 0, 9, 2, 5, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.iron_bars, 0, 9, 2, 4, p_74875_3_); this.fillWithBlocks(p_74875_1_, p_74875_3_, 7, 2, 4, 8, 2, 5, Blocks.air, Blocks.air, false); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.cobblestone, 0, 6, 1, 3, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.furnace, 0, 6, 2, 3, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.furnace, 0, 6, 3, 3, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.double_stone_slab, 0, 8, 1, 1, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.glass_pane, 0, 0, 2, 2, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.glass_pane, 0, 0, 2, 4, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.glass_pane, 0, 2, 2, 6, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.glass_pane, 0, 4, 2, 6, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.fence, 0, 2, 1, 4, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.wooden_pressure_plate, 0, 2, 2, 4, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.iron_block, 0, 1, 1, 5, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.stone_stairs, this.getMetadataWithOffset(Blocks.stone_stairs, 3), 2, 1, 5, p_74875_3_); this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.stone_stairs, this.getMetadataWithOffset(Blocks.stone_stairs, 1), 1, 1, 4, p_74875_3_); int i; int j; if (!this.hasMadeChest) { i = this.getYWithOffset(1); j = this.getXWithOffset(5, 5); int k = this.getZWithOffset(5, 5); if (p_74875_3_.isVecInside(j, i, k)) { this.hasMadeChest = true; this.generateStructureChestContents(p_74875_1_, p_74875_3_, p_74875_2_, 5, 1, 5, ChestGenHooks.getItems(VILLAGE_BLACKSMITH, p_74875_2_), ChestGenHooks.getCount(VILLAGE_BLACKSMITH, p_74875_2_)); } } for (i = 6; i = 8; ++i) { if (this.getBlockAtCurrentPosition(p_74875_1_, i, 0, -1, p_74875_3_).getMaterial() == Material.air this.getBlockAtCurrentPosition(p_74875_1_, i, -1, -1, p_74875_3_).getMaterial() != Material.air) { this.placeBlockAtCurrentPosition(p_74875_1_, Blocks.stone_stairs, this.getMetadataWithOffset(Blocks.stone_stairs, 3), i, 0, -1, p_74875_3_); } } for (i = 0; i 7; ++i) { for (j = 0; j 10; ++j) { this.clearCurrentPositionBlocksUpwards(p_74875_1_, j, 6, i, p_74875_3_); this.func_151554_b(p_74875_1_, Blocks.cobblestone, 0, j, -1, i, p_74875_3_); } } this.spawnVillagers(p_74875_1_, p_74875_3_, 7, 1, 1, 1); return true; } //家に生成させる村人のIDを渡す protected int getVillagerType(int p_74888_1_) { return AluminiumMod.metalVillagerID; } //以下 StructureVillagePieces.Village.House2よりコピペ public static AluminiumHouse func_74915_a(StructureVillagePieces.Start p_74915_0_, List p_74915_1_, Random p_74915_2_, int p_74915_3_, int p_74915_4_, int p_74915_5_, int p_74915_6_, int p_74915_7_) { StructureBoundingBox structureboundingbox = StructureBoundingBox.getComponentToAddBoundingBox(p_74915_3_, p_74915_4_, p_74915_5_, 0, 0, 0, 10, 6, 7, p_74915_6_); return canVillageGoDeeper(structureboundingbox) StructureComponent.findIntersecting(p_74915_1_, structureboundingbox) == null ? new AluminiumHouse(p_74915_0_, p_74915_7_, p_74915_2_, structureboundingbox, p_74915_6_) null; } protected void func_143012_a(NBTTagCompound p_143012_1_) { super.func_143012_a(p_143012_1_); p_143012_1_.setBoolean("Chest", this.hasMadeChest); } protected void func_143011_b(NBTTagCompound p_143011_1_) { super.func_143011_b(p_143011_1_); this.hasMadeChest = p_143011_1_.getBoolean("Chest"); } } 解説 VillagerRegistry void registerVillagerId(int id) 村人のIDを登録するメソッド。 コメントにある通り、村人IDは0~4が既存の村人として設定されているため、それ以外の数値を与える必要がある。 競合を防ぐためには、config等で変更できるようにするとよい。 また、IDはいろいろなところで使うためstatic finalな定数に格納すると便利。 void registerVillageTradeHandler(int villagerId, IVillageTradeHandler handler) 指定したIDの村人に特定の交換を登録するメソッド。 なお、すべての村人(MOD追加されたもの含む)に特定の交換を実装するなら、以下のようなコードが効率的。 (VillagerRegistry.instance().registerVillageTradeHandler(metalVillagerID, new AluminiumTrade());の部分を以下のコードに書き換える。) for(Integer integer VillagerRegistry.getRegisteredVillagers()){ VillagerRegistry.instance().registerVillageTradeHandler(integer, new AluminiumTrade()); } void registerVillagerSkin(int villagerId, ResourceLocation villagerSkin) 指定したIDの村人にスキンを追加するメソッド。 void registerVillageCreationHandler(IVillageCreationHandler handler) 村人の家と村人の生成を登録するメソッド。 MapGenStructureIO ワールドへの構造物生成を管理するクラス。 void registerStructure(Class p_143034_0_, String p_143034_1_) void func_143031_a(Class p_143031_0_, String p_143031_1_) どちらも構造物を登録するメソッド。 registerStructureを先に呼ぶ。 MerchantRecipe これを使ったインスタンスをIVillageTradeHandlerを実装したクラスのmanipulateTradesForVillagerで、第二引数recipeListに追加して村人の交換を管理する。 コンストラクター(ItemStack p_i1942_1_, ItemStack p_i1942_2_) 村人の交換を実装するメソッド。第一引数に渡すもの、第二引数に受け取るものを渡す。 下のコンストラクターを用いてnew MerchantRecipe(p_i1942_1_, (ItemStack)null, p_i1942_2_);と記述するのと同じ意味。 コンストラクター(ItemStack p_i1941_1_, ItemStack p_i1941_2_, ItemStack p_i1941_3_) 村人の交換を実装するメソッド。第一引数・第二引数に渡すもの、第三引数に受け取るものを渡す。 StructureComponent StructureVillagePiecesはこのクラスを継承している。 void fillWithBlocks(World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int maxZ , Block placeBlock, Block replaceBlock, boolean alwaysreplace) x,y,z(structBBで指定された直方体内の相対座標)座標にブロックを敷き詰める。 min**は始点、max**は終点を示している。また、placeBlockは先に設置するブロック、replaceBlockは後に設置するブロック、(基本同じ物を渡す)、alwaysreplaceはreplaceBlockを使用するか否かを それぞれ示している。 コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/akasatanahama/pages/68.html
概要 新しい食料アイテムを追加する。 食べたときにポーションエフェクトを確率で付与することもできる。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.potion.Potion; @Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION) public class AluminiumMod { public static final String MODID = "AluminiumMod"; public static final String MODNAME = "Aluminium Mod"; public static final String VERSION = "1.0.0"; public static Item foodAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { foodAluminium = new ItemFood(5, 2.0F, false) .setPotionEffect(Potion.regeneration.id, 60, 0, 0.8F) .setCreativeTab(CreativeTabs.tabFood) .setUnlocalizedName("foodAluminium") .setTextureName("aluminiummod foodAluminium"); GameRegistry.registerItem(foodAluminium, "foodAluminium"); } } 解説 ItemFood コンストラクタ(int healAmount, float saturationModifier, boolean isWolfsFavoriteMeat) 引数は順に、満腹度回復量・隠し満腹度回復量(腹持ち)・オオカミが食べられるか ItemFood setPotionEffect(int potionId, int potionDuration, int potionAmplifier, float potionEffectProbability) 食べたときに確率でポーションエフェクトを付与する。 引数は順に、ポーションID・効果時間・効果レベル・付与される確率。 効果時間は単位が秒なので注意。 効果レベルは表示値より1少ない。(0がレベル1) 使用例 オファレンMODの回復玉を追加している部分。 回復玉は、ItemFoodを継承しているが、オーバーライドして変えている部分も多い。 +オファレンMOD OfalenModCore.java package nahama.ofalenmod; /*略*/ /** @author Akasata Nahama */ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore { public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String VERSION = "[1.7.10]1.0.0"; /*略*/ /** 最初に行われる処理。アイテム・ブロックの追加などを行う */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/ // アイテムを設定するメソッドを実行 OfalenModItemCore.registerItem(); /*略*/ } /*略*/ } OfalenModItemCore.java package nahama.ofalenmod.core; /*略*/ public class OfalenModItemCore { /*略*/ public static Item ballRecovery; /*略*/ /**アイテムを設定する*/ public static void registerItem () { /*略*/ ballRecovery = new OfalenBall(new PotionEffect[]{new PotionEffect(Potion.heal.id, 1, 0)}) .setUnlocalizedName("ballRecovery") .setTextureName("ofalenmod recovery_ball"); GameRegistry.registerItem(ballRecovery, "ballRecovery"); /*略*/ } } OfalenBall.java package nahama.ofalenmod.item; import nahama.ofalenmod.OfalenModCore; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; public class OfalenBall extends ItemFood { /**付与するポーション効果の配列*/ private final PotionEffect[] effects; /**新規コンストラクター。ポーション効果の配列を受け取る。*/ public OfalenBall(PotionEffect[] effects) { super(0, 0.0F, false); this.effects = effects; this.setCreativeTab(OfalenModCore.tabOfalen); } /**食べるのにかかる時間を返す。(通常よりも少し早い) * @return 20*/ @Override public int getMaxItemUseDuration(ItemStack itemStack) { return 20; } /**右クリックされた時の処理。ItemFoodの満腹度の判定を消している。*/ @Override public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); return itemStack; } /**食べる時の処理。クリエイティブモードではアイテム数が減らないようにしている。また、ポーション効果も付与する。*/ /* EntityLivingBase.addPotionEffect(PotionEffect)では、効果時間を上書きしているらしい(?)ので、 * 新たにPotionEffectのオブジェクトを生成して引数として渡している。*/ @Override public ItemStack onEaten(ItemStack itemStack, World world, EntityPlayer player) { //クリエイティブモード以外ならスタックサイズを減らす。 if (!player.capabilities.isCreativeMode) { --itemStack.stackSize; } //つけるポーション効果の数だけ繰り返す。 for (int i = 0; i effects.length; i ++) { //サーバー側の処理で、情報が正常なら処理を続ける。 if (!world.isRemote effects[i] != null effects[i].getPotionID() 0) { //即時回復なら、 if (effects[i].getPotionID() == Potion.heal.id) { //ID・効果時間を固定して、 PotionEffect effect = new PotionEffect(Potion.heal.id, 1, effects[i].getAmplifier()); //プレイヤーに付与。 player.addPotionEffect(effect); //即時回復以外なら、 } else { //効果時間のみ固定して、 PotionEffect effect = new PotionEffect(effects[i].getPotionID(), effects[i].getDuration(), effects[i].getAmplifier()); //プレイヤーに付与。 player.addPotionEffect(effect); } } } world.playSoundAtEntity(player, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); return itemStack; } } コメント この項目に関する質問などをどうぞ。 ItemFood setPotionEffect の引数が (int, int, int, float) ではなく (string) になっているのですが、なぜですか? - あるふぁ 2017-05-20 14 48 36 自己解決しました。 - あるふぁ 2017-05-20 14 51 35 金リンゴのように、満腹度MAXの時でも食べられるものはどう作るのですか? - あるふぁ 2017-05-20 14 54 50 こちらも解決しました。setAlwaysEdible()を使いました。 - あるふぁ 2017-05-20 18 57 23 名前